package org.longteng.mobileluck.algorithm.dao.impl;

import lombok.extern.slf4j.Slf4j;
import org.longteng.mobileluck.algorithm.bean.MobileNumAuspiciousTable;
import org.longteng.mobileluck.algorithm.bean.MobileNumFortuneTable;
import org.longteng.mobileluck.algorithm.dao.MobileNumAuspiciousDao;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;


/**
 * 机号码运势说明表数据读入csv实现
 * @author hymn.com
 */
@Slf4j
@Service("mobileNumFortuneTable")
public class MobileNumFortuneDaoImpl extends ParserCsvBaseDao implements MobileNumAuspiciousDao {
    /**手机号码吉祥如意表*/
    private final Map<Integer, MobileNumFortuneTable> mobileNumFortuneMap;

    /**
     * 构造是读入csv手机号码吉祥如意表
     */
    public MobileNumFortuneDaoImpl() {
        List<MobileNumFortuneTable> mobileNumAuspiciousList = this.readTableCsv("/table/mobilenum_fortune.csv");
        if (mobileNumAuspiciousList == null) {
            log.warn("读入csv手机号码吉祥如意运势表为空无法初始化手机号码吉祥如意运势表映射。");
            mobileNumAuspiciousList = new ArrayList<>();
        }

        this.mobileNumFortuneMap = mobileNumAuspiciousList.stream().collect(Collectors.toMap(MobileNumAuspiciousTable::getMobileNum, Function.identity(), (key1, key2) -> key2));

        // 如果得数刚好是整数，小数部分为“0”，则此人拥有非常人的能力，能够跳出三界外，不在五行中，这样散仙级的人物，自然是：经常处于戒备状态，对任何事都没法放松处理，孤僻性情难以交朋结友。对于爱情，就更加会慎重处理。任何人必须经过你长期观察及通过连番考验，方会减除戒备与你交往。
        MobileNumFortuneTable mobileNumFortuneTable = new MobileNumFortuneTable();
        mobileNumFortuneTable.setMobileNum(0);
        mobileNumFortuneTable.setMeaning("经常处于戒备状态，对任何事都没法放松处理，孤僻性情难以交朋结友。对于爱情，就更加会慎重处理。任何人必须经过你长期观察及通过连番考验，方会减除戒备与你交往。");
        mobileNumFortuneTable.setLuckStatus("大吉");
        mobileNumFortuneTable.setFortuneStatus("散仙级");
        this.mobileNumFortuneMap.put(0, mobileNumFortuneTable);
        if (log.isDebugEnabled()) {
            log.debug("读入csv手机号码吉祥如意运势表:\n ->{}", mobileNumFortuneMap);
        }
    }

    /**
     * 根据手机计算号取，吉祥如意表信息
     *
     * @param mobileNum
     * @return
     */
    @Override
    public MobileNumFortuneTable getAuspiciousEntity(int mobileNum) {
        return this.mobileNumFortuneMap.get(mobileNum);
    }

    /**
     * 获取泛型T的类型 T.class
     * <br>Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
     * <br>可能会有错误：java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
     * <br>子类直接实现返回真实类class
     *
     * @return
     */
    @Override
    public Class getTClass() {
        return MobileNumFortuneTable.class;
    }
}
